#pragma once

/* 内存数据库Redis相关的操作 */

#include <sw/redis++/redis++.h>
#include <iostream>

namespace ChatSystem
{
    typedef sw::redis::Redis redis_t;

    //构造Redis客户端的工厂类
    class RedisClientFactory
    {
    public:
        static std::shared_ptr<redis_t> creat(
            const std::string& host,
            int port,
            int db,
            bool keep_alive)
        {
            // 构造连接选项实例化
            sw::redis::ConnectionOptions opts;
            opts.host = host;
            opts.port = port;
            opts.db = db;
            opts.keep_alive = keep_alive;

            std::shared_ptr<redis_t> ret(new redis_t(opts));
            return ret;
        }
    private:

    };

    //会话管理
    class Session
    {
    public:
        using ptr = std::shared_ptr<ChatSystem::Session>;
        Session(const std::shared_ptr<redis_t>& redis_client)
        :_redis_client(redis_client)
        {}
        ~Session(){}

        //会话信息的新增
        void append(const std::string& ssid, const std::string& uid)
        {
            _redis_client->set(ssid, uid);
        }
        //会话信息的删除
        void remove(const std::string& ssid)
        {
            _redis_client->del(ssid);
        }   
        //会话信息的获取
        sw::redis::OptionalString uid(const std::string& ssid)
        {
            return _redis_client->get(ssid);
        }
    private:
        std::shared_ptr<redis_t> _redis_client;
    };

    //登录状态管理
    class Status
    {
    public:
        using ptr = std::shared_ptr<ChatSystem::Status>;
        Status(const std::shared_ptr<redis_t>& redis_client)
        :_redis_client(redis_client)
        {}
        ~Status(){}

        //登录状态的新增
        void append(const std::string& uid)
        {
            _redis_client->set(uid, "");
        }
        //登录状态的删除
        void remove(const std::string& uid)
        {
            _redis_client->del(uid);
        }
        //判断某个用户是否登录
        bool exists(const std::string& uid)
        {
            auto res = _redis_client->exists(uid);
            return res;
        }

    private:
        std::shared_ptr<redis_t> _redis_client;
    };


    //验证码信息管理
    class Codes
    {
    public:
        using ptr = std::shared_ptr<ChatSystem::Codes>;
        Codes(const std::shared_ptr<redis_t>& redis_client)
        :_redis_client(redis_client)
        {}
        ~Codes(){}

        //验证码信息的新增并设置一个超时时间
        bool append(const std::string& cid, const std::string& code, 
            const std::chrono::seconds& timeout = std::chrono::seconds(60))
        {
            return _redis_client->set(cid, code, timeout);
        }
        //验证码信息的删除
        void remove(const std::string& cid)
        {
            _redis_client->del(cid);
        }
        //获取验证码
        sw::redis::OptionalString code(const std::string& cid)
        {
            return _redis_client->get(cid);
        }

    private:
        std::shared_ptr<redis_t> _redis_client;
    };
}
